<template>
  <div class="image-container">
    <div>
      image组件
    </div>

    <div>
      abd
    </div>
    <el-card class="box-card">
      <div slot="header" class="clearfix">
        <my-breadcrumb>素材管理</my-breadcrumb>
      </div>
      <div>
        <div style="padding-bottom: 20px">
          <el-radio-group v-model="isCollected" size="mini" @change="hSwitchCollect">
            <el-radio-button label="全部"></el-radio-button>
            <el-radio-button label="收藏"></el-radio-button>
          </el-radio-group>

          <!-- 点击之后：把弹层显示出来 -->
          <el-button style="float:right" type="success" size="mini" @click="hOpenUpload">
            上传图片素材
          </el-button>
        </div>
      </div>
      <!-- row表示一行，分成24列 -->
      <!-- gutter: 列与列之间的间隔 -->
      <!-- :span="6" 占24中的6列， 就是1/4 -->
      <el-row :gutter="10">
        <el-col
          v-for="image in images"
          :key="image.id"
          class="img_item" :span="4">
          <el-image
            style="height:180px; width:180px"
            :src="image.url">
          </el-image>
          <!-- 操作区域 -->
          <div class="option" v-show="isCollected==='全部'">
            <!-- 如果is_collected是true，则高亮显示：添加red类 -->
            <span
              class="el-icon-star-off"
              :class="{red:image.is_collected}"
              @click="hSwitchCollectImage(image)"
            ></span>
            <span class="el-icon-delete" @click="hDelete(image)"></span>
          </div>
        </el-col>

      </el-row>

      <!-- 分页
        total: 一共有多少条数据
        page-size: 一页显示几条数据 默认是10条
        current-change:点击页码时，它会触发
        :disabled="isLoading"
      -->
      <el-pagination
        background
        layout="prev, pager, next"
        :page-size="10"
        @current-change="hCurrentChange"
        :total="total_count">
      </el-pagination>
    </el-card>

    <!--
      :visible.sync="dialogVisible"
      给visible属性添加一个.sync修改符

      在el-dialog的代码内部，在点击关闭弹层时，会抛出一个事件，名为
      update:visible来修改 dialogVisible 的值

      append-to-body: 把这个对话框挂载到body上，这样确保它显示在最前面
     -->
    <el-dialog
      title="上传素材"
      append-to-body
      :visible.sync="dialogVisible"
      width="30%">
      <!--
          [el-upload](https://element.eleme.cn/#/zh-CN/component/upload#yong-hu-tou-xiang-shang-chuan)的主要属性：
          // 不走axios请求
          // 不走axios请求
          // 不走axios请求
          // 不走axios请求
          - action： 必选参数，上传的地址：http://ttapi.research.itcast.cn/mp/v1_0/user/images
          - headers: 设置上传的请求头部。要携带token
          - name：上传的文件字段名。要与接口中要求保持一致。
          - show-file-list： 是否显示已上传文件列表
          - before-upload: 上传之前对文件进行检测。
          - on-success：文件上传成功时的钩子。`function(response, file, fileList)` -->
        <el-upload
          class="avatar-uploader"
          action="http://api-toutiao-web.itheima.net/mp/v1_0/user/images"
          name="image"
          :headers="headers"
          :show-file-list="false"
          :on-success="handleAvatarSuccess"
          :before-upload="beforeAvatarUpload">
            <!-- 如果上传成功了，就显示这个图片 -->
            <!-- 对于图片来说，并不是一旦设置了src之后，就立即可以看到效果 -->
            <!-- <img v-if="imageUrl" :src="imageUrl" class="avatar"> -->
            <!-- load事件：表示这张图已经加载完成，用户肯定是可以能看到了 -->
            <el-image v-if="imageUrl" :src="imageUrl" class="avatar" @load="hImageLoad" />
            <!-- 否则，显示加号 -->
            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
        </el-upload>
    </el-dialog>

  </div>
</template>
<script>
export default {
  name: 'images',
  data () {
    return {
      headers: {
        Authorization: `Bearer ${localStorage.getItem('tokenStr')}`
      },
      imageUrl: '', // 图片上传
      dialogVisible: false, // 是否显示弹层
      // isLoading: false, // 是否正在加载
      isCollected: '全部',
      page: 1, // 当前要查询的页数
      total_count: 0, // 一共有多少条
      images: [] // 图片列表
    }
  },
  created () {
    this.loadImages()
  },
  methods: {
    async doDelete (image) {
      try {
        const res = await this.$axios({
          url: '/mp/v1_0/user/images/' + image.id,
          method: 'DELETE'
        })
        console.log(res)
        this.$message.success('操作成功')

        // 更新页面
        this.loadImages()
      } catch (err) {
        this.$message.error('操作失败')
        console.log(err)
      }
    },
    // 删除图片
    hDelete (image) {
      this.$confirm('你确定要删除吗').then(() => {
        this.doDelete(image)
      }).then(() => {})
    },
    // 用户切换选中素材
    async hSwitchCollectImage (image) {
      console.log(image, image.is_collected)
      try {
        const res = await this.$axios({
          method: 'PUT',
          url: '/mp/v1_0/user/images/' + image.id,
          data: {
            // 之前是收藏，现在要取消；之前是取消的，现在要收藏
            collect: !image.is_collected // 取反
          }
        })
        console.log(res)
        // 提示用户
        this.$message.success('操作成功')
        // 更新视图
        //  1. 重新加载：把当前页的数据全部重新求一遍
        // this.loadImages()
        //  2. 直接在本地更新数据项
        image.is_collected = !image.is_collected
      } catch (err) {
        console.log(err)
        this.$message.error('操作失败')
      }
    },
    hOpenUpload () {
      this.dialogVisible = true
      // 清空掉上一次的执行结果
      this.imageUrl = ''
    },
    hCurrentChange (curPage) {
      // 1. 更新页码
      this.page = curPage
      // 2. 重发请求
      this.loadImages()
    },
    // 用户在收藏 和 全部 之间切换
    hSwitchCollect () {
      // 把页码重置为1
      this.page = 1
      this.loadImages()
    },
    // 单独封装一个方法来获取当前的查询参数
    buildParams () {
      const paramObj = {
        // collect  否 true 或 false 是否是收藏的图片
        collect: this.isCollected === '收藏',
        // page     否 页数
        page: this.page,
        // per_page 否 每页数量
        per_page: 10
      }
      return paramObj
    },
    async loadImages () {
      try {
        const params = this.buildParams()

        const res = await this.$axios({
          method: 'GET',
          url: '/mp/v1_0/user/images',
          params
        })
        console.log(res)
        // 保存数据
        this.images = res.data.data.results
        this.total_count = res.data.data.total_count
      } catch (err) {
        console.log(err)
      }
    },
    // 上传后的图片，重新被预览出来了
    // 图片显示完成之后，过2秒钟关闭它
    hImageLoad () {
      setTimeout(() => {
        this.dialogVisible = false
        // 重新请求一次
        this.loadImages()
      }, 2000)
    },
    // 上传成功，会自动调用
    //  -  res就是接口返回的数据
    //  -  file:文件对象
    handleAvatarSuccess (res, file) {
      console.log('上传成功', res, file)
      this.$message.success('上传成功')
      //  是不是赋值之后，用户立即就可以看到图？
      this.imageUrl = res.data.url
    },
    // 对图片的有效性进行检测
    beforeAvatarUpload (file) {
      const isJPG = file.type === 'image/jpeg'

      // 是否小于2M
      const isLt2M = file.size / 1024 / 1024 < 2

      if (!isJPG) {
        this.$message.error('上传头像图片只能是 JPG 格式!')
      }
      if (!isLt2M) {
        this.$message.error('上传头像图片大小不能超过 2MB!')
      }
      return isJPG && isLt2M
    }
  }
}
</script>
<style lang="less" scoped>
  .img_item {
    position: relative;
    box-sizing: border-box;
  }
  .option {
    position: absolute;
    left: 5px;
    width:180px;
    bottom: 5px;
    height: 30px;
    line-height: 30px;
    background: rgba(0, 0, 0, 0.3);
    text-align: center;
    color: #fff;
    span {
      margin: 0 30px;
      cursor: pointer;
    }
  }
  .red {
    color: red
  }
  .avatar-uploader {
    text-align: center;
  }
  // .el-upload这个el-upload组件内部自已带的class
  // 由于这里的样式 加了scoped，要想在父组件中选中子组件的
  // 样式，就需要加一个/deep/  ----- 它是vue中的概念
  .image-container /deep/ .el-upload {
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    cursor: pointer;
    position: relative;
    overflow: hidden;
  }
  .avatar-uploader .el-upload:hover {
    border-color: #409EFF;
  }
  // .avatar-uploader .avatar-uploader-icon {

  // }
  .avatar-uploader-icon {
    font-size: 28px;
    color: #8c939d;
    width: 178px;
    height: 178px;
    line-height: 178px;
    text-align: center;
  }
  .avatar {
    width: 178px;
    height: 178px;
    display: block;
  }
</style>

<style lang="less">
// 加了scoped之后，下面的样式只会在当前的组件(images.vue)中生效。不会影响其它的组件

// 如果你的选择器，在当前中页面中，选中的多个，肯定也会有多个生效
// 在vue中，每一个组件都会有一个特殊的编号，在生成结构时会把这个编号
// 以属性的方式加在dom容器上。（data-v-标识符）

// 在写样式的过程中，如果加了scoped，则会自动在选择器的最后面补上 上面的 标识符
// 这样，就产生一个私有作用域的效果

// 只选中 有data-v-abc这个属性的 div块

  // div{ color:red }
  // div[data-v-abc] { color:red }
</style>
